package com.whosly.mysql.protocol;

/**
 * @author fengyang
 * @date 2023/8/17 下午9:02
 * @see <a href="yueny09@163.com">mailTo: yueny09@163.com</a>
 */
public enum TransactionIsolation
{
    /*
     * 不支持事务。在事务枚举中不应该存在
     */
    @Deprecated
    NAN("-"),

    /**
     * A constant indicating that dirty reads, non-repeatable reads and phantom reads can occur.
     * This level allows a row changed by one transaction to be read by another transaction before any changes in that row have been committed (a "dirty read").
     *
     * If any of the changes are rolled back, the second transaction will have retrieved an invalid row.
     */
    READ_UNCOMMITTED("READ-UNCOMMITTED"),

    /**
     * A constant indicating that dirty reads are prevented; non-repeatable reads and phantom reads can occur.
     *
     * This level only prohibits a transaction from reading a row with uncommitted changes in it.
     */
    READ_COMMITTED("READ-COMMITTED"),

    /**
     * A constant indicating that dirty reads and non-repeatable reads are prevented; phantom reads can occur.
     *
     * This level prohibits a transaction from reading a row with uncommitted changes in it,
     * and it also prohibits the situation where one transaction reads a row,
     * a second transaction alters the row, and the first transaction rereads the row,
     * getting different values the second time (a "non-repeatable read").
     */
    REPEATABLE_READ("REPEATABLE-READ"),

    /**
     * A constant indicating that dirty reads, non-repeatable reads and phantom reads are prevented.
     *
     * This level includes the prohibitions in TRANSACTION_REPEATABLE_READ and further prohibits the situation where one transaction reads all rows that satisfy a WHERE condition,
     * a second transaction inserts a row that satisfies that WHERE condition,
     * and the first transaction rereads for the same condition,
     * retrieving the additional "phantom" row in the second read.
     */
    SERIALIZABLE("SERIALIZABLE");

    /**
     * 在 JDBC Client 约定的 transIsolationNameToValue 值
     */
    private String transIsolationNameToValue;

    TransactionIsolation(String transIsolationNameToValue)
    {
        this.transIsolationNameToValue = transIsolationNameToValue;
    }

    public String getTransIsolationNameToValue()
    {
        return transIsolationNameToValue;
    }
}
